home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / programm / gemfsc20 / gemfsc20.lzh / GEMFUNCS / FRMMENU.C < prev    next >
C/C++ Source or Header  |  1993-03-20  |  5KB  |  226 lines

  1. /**************************************************************************
  2.  * FRMMENU.C - The frm_menu() and frm_mdo() functions.
  3.  *************************************************************************/
  4.  
  5. #include "gemfintl.h"
  6.  
  7. #define BLITOPTIONS (FRM_USEBLIT|FRM_MOVEABLE)
  8.  
  9. #define MU_M1_ENTRY 0
  10. #define MU_M1_EXIT    1
  11.  
  12. /*----------------------------------------------------------------------------
  13.  *
  14.  *--------------------------------------------------------------------------*/
  15.  
  16. #ifdef GEMFAST_PROTOS
  17.   static void wait_buttonup(void)
  18. #else
  19.   static void wait_buttonup()
  20. #endif
  21. {
  22.     short dmy;
  23.     evnt_button(1,1,0,&dmy,&dmy,&dmy,&dmy);
  24. }
  25.  
  26. /*----------------------------------------------------------------------------
  27.  *
  28.  *--------------------------------------------------------------------------*/
  29.  
  30. #ifdef GEMFAST_PROTOS
  31.   static short find_default_exit(register OBJECT *ptree)
  32. #else
  33.   static short find_default_exit(ptree)
  34.     register OBJECT *ptree;
  35. #endif
  36. {
  37.     register short      counter = 0;
  38.  
  39.     for (;;) {
  40.         if (ptree->ob_flags & DEFAULT) {
  41.             return counter;
  42.         }
  43.         if (ptree->ob_flags & LASTOB) {
  44.             return NO_OBJECT;
  45.         }
  46.         ++ptree;
  47.         ++counter;
  48.     }
  49. }
  50.  
  51. /*----------------------------------------------------------------------------
  52.  *
  53.  *--------------------------------------------------------------------------*/
  54.  
  55. short frm_mdo(ctl)
  56.     register FormControl *ctl;
  57. {
  58.     short              mx;
  59.     short              my;
  60.     short              mb;
  61.     short              dmy;
  62.     short              exit_condition;
  63.     short              mouse_object;
  64.     short              watch_object;
  65.     short              selected_object;
  66.     short              ob_flags;
  67.     short              ob_state;
  68.     GRECT            leaverect;
  69.     XMULTI            xm;
  70.     register OBJECT *ptree = ctl->ptree;
  71.  
  72.     wind_update(BEG_MCTRL);
  73.  
  74.     if (ctl->options & FRM_MEXITPARENT) {
  75.         obj_clcalc(ptree, ctl->parentobj, &leaverect, NULL);
  76.     } else if (ctl->options & FRM_MEXITVICINITY) {
  77.         obj_clcalc(ptree, ctl->parentobj, &leaverect, NULL);
  78.         rc_gadjust(&leaverect, 4*gl_wchar, 2*gl_hchar);
  79.         rc_intersect(&gl_rwdesk,  &leaverect);
  80.     } else {
  81.         rc_copy(&gl_rwdesk, &leaverect);
  82.     }
  83.  
  84.     watch_object    = ctl->parentobj;
  85.     selected_object = NO_OBJECT;
  86.  
  87.     xm.mflags    = MU_M1 | MU_BUTTON;
  88.     xm.mbclicks = 1;
  89.     xm.mbmask    = 1;
  90.     xm.mbstate    = 1;
  91.     xm.mm1flags = MU_M1_ENTRY;
  92.  
  93.     if (ctl->defaultobj != NO_OBJECT) {
  94.         xm.mflags |= MU_KEYBD;
  95.     }
  96.  
  97.     do    {
  98.         exit_condition = FALSE;
  99.         obj_clcalc(ptree, watch_object, &xm.mm1rect, NULL);
  100.  
  101.         evnx_multi(&xm);
  102.         graf_mkstate(&mx, &my, &mb, &dmy);
  103.  
  104.         if ((xm.mwhich & MU_M1) && (selected_object != NO_OBJECT)) {
  105.             obj_stchange(ptree, selected_object, ~ctl->select_state,
  106.                 OBJ_CLIPDRAW, ctl->pboundrect);
  107.             selected_object = NO_OBJECT;
  108.         }
  109.  
  110.         mouse_object = objc_find(ptree, ctl->parentobj, MAX_DEPTH, mx, my);
  111.         watch_object = ctl->parentobj;
  112.         xm.mm1flags  = MU_M1_ENTRY;
  113.  
  114.         if (mouse_object == NO_OBJECT) {
  115.             if (!rc_ptinrect(&leaverect, mx, my)) {
  116.                 exit_condition = TRUE;
  117.             }
  118.         } else {
  119.             ob_flags = ptree[mouse_object].ob_flags;
  120.             ob_state = ptree[mouse_object].ob_state;
  121.             if ( (ob_flags & (SELECTABLE|EXIT|TOUCHEXIT|DEFAULT)) &&
  122.                 !(ob_state & DISABLED)) {
  123.                 selected_object = mouse_object;
  124.                 if (!(ob_flags & (EXIT|DEFAULT|TOUCHEXIT))) {
  125.                     watch_object = mouse_object;
  126.                     xm.mm1flags = MU_M1_EXIT;
  127.                     obj_stchange(ptree, mouse_object, ctl->select_state,
  128.                         OBJ_CLIPDRAW, ctl->pboundrect);
  129.                 }
  130.             }
  131.         }
  132.  
  133.         if (xm.mwhich & MU_BUTTON) {
  134.             exit_condition = TRUE;
  135.             if (selected_object != NO_OBJECT && (ob_flags & (EXIT|DEFAULT))) {
  136.                 if (!graf_watchbox(ptree, selected_object, ctl->select_state, ob_state)) {
  137.                     exit_condition = FALSE;
  138.                     selected_object = NO_OBJECT;
  139.                 }
  140.             }
  141.         }
  142.  
  143.         if (xm.mwhich & MU_KEYBD && (xm.mkreturn & 0x00FF) == '\r') {
  144.             selected_object = ctl->defaultobj;
  145.             exit_condition    = TRUE;
  146.             obj_stchange(ptree, selected_object, ctl->select_state,
  147.                 OBJ_CLIPDRAW, ctl->pboundrect);
  148.         }
  149.  
  150.         if ((ctl->options & FRM_DMUSTSELECT) && selected_object == NO_OBJECT) {
  151.             exit_condition = FALSE;
  152.         }
  153.  
  154.     } while (!exit_condition);
  155.  
  156.     wind_update(END_MCTRL);
  157.  
  158.     return selected_object;
  159. }
  160.  
  161. /*----------------------------------------------------------------------------
  162.  *
  163.  *--------------------------------------------------------------------------*/
  164.  
  165. short frm_menu(options, ptree, select_state)
  166.     long            options;
  167.     register OBJECT *ptree;
  168.     short             select_state;
  169. {
  170.     FormControl     ctl;
  171.     short              selobj;
  172.     long            actions;
  173.  
  174.     if (0 == (actions = options & FRM_ACTIONBITS)) {
  175.         options  |= (actions = FRM_DCOMPLETE);
  176.     }
  177.  
  178.     if (actions == FRM_DCOMPLETE) {
  179.         wind_update(BEG_UPDATE);
  180.         wind_update(BEG_MCTRL);
  181.     } else {
  182.         if (options & BLITOPTIONS) {
  183.             options &= ~BLITOPTIONS;
  184.         }
  185.     }
  186.  
  187.     wait_buttonup();
  188.  
  189.     _FrmSetup(&ctl, options, ptree, NULL);
  190.     ctl.select_state = select_state;
  191.     ctl.form_do      = frm_mdo;
  192.     ctl.defaultobj     = find_default_exit(ptree);
  193.  
  194.     if (actions & FRM_DSTART) {
  195.         frm_start(&ctl);
  196.     }
  197.  
  198.     if (actions & FRM_DDRAW) {
  199.         frm_draw(&ctl, ROOT);
  200.     }
  201.  
  202.     if (actions & FRM_DDO) {
  203.         selobj = frm_do(&ctl, 0);
  204.     }
  205.  
  206.     if (actions & FRM_DFINISH) {
  207.         frm_finish(&ctl);
  208.     }
  209.  
  210.     frm_cleanup(&ctl);
  211.  
  212.     if (!(ptree[selobj].ob_flags & TOUCHEXIT)) {
  213.         wait_buttonup();
  214.     }
  215.  
  216.     if (actions == FRM_DCOMPLETE) {
  217.         wind_update(END_MCTRL);
  218.         wind_update(END_UPDATE);
  219.     }
  220.  
  221.     return selobj;
  222. }
  223.  
  224.  
  225.  
  226.